
package com.zhike.common.dto;

import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import com.zhike.common.constant.ChatType;

import lombok.extern.slf4j.Slf4j;

/**
 * 消息body根类：普通聊天消息（指的是区别于非聊天消息的指令）中提炼出来的共有
 * 消息体字段属性。
 * <p>
 * 即聊天数据从MobileIMSDK底层发送时，会将本对象转JSON字串后，作为
 * Protocal的dataContent数据进行传输。
 * <p>
 * <b>理论上：</b>RainbowChat中用户可读的聊天消息（包括单聊、陌生人聊、世界频道、群聊）
 * 的消息body都应是本类的子类，否则服务端的离线处理将不会进行离线消息持久化（前提
 * 是需要离线存储的话，比如世界频道已经从逻辑上不需要支持离线的）。
 * 
 * @author Jack Jiang
 * @since 4.3
 */
@Slf4j
public class MsgBodyRoot extends QuoteMeta implements MsgType, ChatType {
	/**
	 * From user uid（即消息发送者的id）.
	 */
	protected String f = null;
	/**
	 * To user id or group id。
	 * <p>
	 * <b>即消息接收者的id：</b><br>
	 * 1）在群聊消息时，本字段存放的是群组id；<br>
	 * 2）普通一对的聊天时才是用户uid。
	 */
	protected String t = null;

	/**
	 * 消息内容字段（为了简化复杂性，建议保证只放纯文本）。
	 */
	protected String m = null;

	/**
	 * 消息内容扩展字段2，不用时可为空。
	 * <p>
	 * 当前用途：
	 * 1）用于文件消息时的文件md5码。
	 * 
	 * @since 4.3
	 */
	protected String m2 = null;

	/**
	 * 消息内容扩展字段3，不用时可为空。
	 * <p>
	 * 当前用途：
	 * 1）用于文件消息时的文件长度（long整数）。
	 * 
	 * @since 4.3
	 */
	protected String m3 = null;

	/**
	 * 会话ID
	 * 用于单聊或群聊的会话生命周期
	 */
	protected String sessionId = null;

	/**
	 * 聊天模式类型（默认值为 {@link #CHAT_TYPE_FREIDN$CHAT} ）.
	 * 
	 * @since RainbowChat 4.3
	 */
	protected int cy = CHAT_TYPE_FREIDN$CHAT;

	/**
	 * 聊天消息类型（默认值为 {@link #TYPE_TEXT} ）.
	 * 
	 * @since RainbowChat 2.2
	 */
	protected int ty = TYPE_TEXT;

	public MsgBodyRoot() {
		//
	}

	public String getF() {
		return f;
	}

	public void setF(String f) {
		this.f = f;
	}

	public String getT() {
		return t;
	}

	public void setT(String t) {
		this.t = t;
	}

	public String getM() {
		return m;
	}

	public void setM(String m) {
		this.m = m;
	}

	public int getTy() {
		return ty;
	}

	public void setTy(int ty) {
		this.ty = ty;
	}

	public String getM2() {
		return m2;
	}

	public void setM2(String m2) {
		this.m2 = m2;
	}

	public String getM3() {
		return m3;
	}

	public void setM3(String m3) {
		this.m3 = m3;
	}

	public int getCy() {
		return cy;
	}

	public void setCy(int cy) {
		this.cy = cy;
	}

	/**
	 * 从JSON字串中反序列化。
	 * 
	 * @param originalMsg 即MsgBodyRoot对象的JSON序列化文本
	 * @return 解析成功则返回对象，否则返回null
	 * @since 2.0_rc11
	 */
	public static MsgBodyRoot parseFromSender(String originalMsg) {
		try {
			return new Gson().fromJson(originalMsg, MsgBodyRoot.class);
		} catch (JsonSyntaxException e) {
			log.error("{}", e);
			return null;
		}
	}
}
